export { }
// function log(target, propertyKey, descriptor) {
//   const originalMethod = descriptor.value // 获取函数体
//   // 重写函数体
//   descriptor.value = function(...args: any[]) {
//     originalMethod(...args) // 调用原始的函数体
//     console.log('函数对应的装饰器执行了', target , propertyKey, descriptor)
//   }
// }

// class Calculator {
//   @log
//   static add(a: number, b: number) {
//     return a + b
//   }
// }
// Calculator.add(1,2)


// 权限控制
// let users = {
//   '001': { roles: ['admin'] },
//   '002': { roles: ['member'] }
// }
// function authorize(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
//   const originalMethod = descriptor.value // 通过属性描述符对象来获取函数体
//   // 重写函数
//   descriptor.value = function (...args: any[]) {
//     let user = users[args[0]]
//     if (user && user.roles.includes('admin')) {
//       originalMethod.apply(this, args)
//       console.log('有权限 删除成功')
//     } else {
//       console.log('没有权限 删除失败')
//     }

//   }
// }
// class AdminPanel {
//   @authorize
//   deleteUser(userId: string) {
//     console.log(userId)
//   }
// }
// const adminPanel = new AdminPanel()
// adminPanel.deleteUser('001')



// 方法装饰器缓存计算结果
function cache(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value
  const cacheMap = new Map<string, any>() // 缓存参数及参数对应的运算结果
  descriptor.value = function(...args: any[]) {
    const key = JSON.stringify(args)
    if (cacheMap.has(key)) return cacheMap.get(key) // 根据参数返回缓存结果
    const result = originalMethod.apply(this, args) // 调用默认的函数
    console.log('计算了一次')
    cacheMap.set(key, result) // 缓存参数及参数对应的运算结果
    return result
  }
}
class MathOperations {
  @cache
  factorial(n: number) {
    if (n <= 1) return n
    return n * this.factorial(n-1)
  }
}
const mathOperations = new MathOperations
console.log(mathOperations.factorial(5))
console.log(mathOperations.factorial(5))
